﻿using log4net;
using PcaCore.BOL.Pca;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NpgsqlTypes;
using System.Reflection;

namespace PcaCore.DAL.Pca
{
    public class dEmpresa
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(dEmpresa));

        #region Public

        public static void Insert(oEmpresa myClass)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_add_empresa(varchar,--empresa_id $1
                //          varchar,--codigo $2
                //          varchar,--nombre $3
                //          varchar,--nombre_comercial $4
                //          varchar --direccion $5
                //          )RETURNS void
                Core.ExecuteNonQuery("pca.fn_add_empresa",
                                     new oParametro(NpgsqlDbType.Varchar, myClass.empresa_id),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.codigo),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.nombre),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.nombre_comercial),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.direccion));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Update(oEmpresa myClass)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_update_empresa(varchar,--empresa_id $1
                //         varchar,--codigo $2
                //         varchar,--nombre $3
                //         varchar,--nombre_comercial $4
                //         varchar,--direccion $5
                //         boolean --activo $6
                //         )RETURNS void
                Core.ExecuteNonQuery("pca.fn_update_empresa",
                                     new oParametro(NpgsqlDbType.Varchar, myClass.empresa_id),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.codigo),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.nombre),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.nombre_comercial),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.direccion),
                                     new oParametro(NpgsqlDbType.Boolean, myClass.activo));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Delete(string empresaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_del_empresa(varchar --empresa_id $1
                //          )RETURNS void
                Core.ExecuteNonQuery("pca.fn_del_empresa",
                                     new oParametro(NpgsqlDbType.Varchar, empresaId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static oEmpresa Get(string empresaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_get_empresa(varchar--empresa_id $1
                //          )RETURNS SETOF pca.empresas
                return Core.GetObjectDb<oEmpresa>("pca.fn_get_empresa",
                                                    new oParametro(NpgsqlDbType.Varchar, empresaId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oEmpresa> GetList()
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_get_list_empresas()RETURNS SETOF pca.empresas
                return Core.GetListObjecstDb<oEmpresa>("pca.fn_get_list_empresas");
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oEmpresa> GetList(int start,
                                             int limit,
                                             out int totalRecords)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_get_list_empresas(integer,--start $1
                //            integer --limit $2
                //            )RETURNS SETOF refcursor
                return Core.GetListObjecstDb<oEmpresa>("pca.fn_get_list_empresas",
                                                       out totalRecords,
                                                       new oParametro(NpgsqlDbType.Integer, start),
                                                       new oParametro(NpgsqlDbType.Integer, limit));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oEmpresa> GetList(int start,
                                             int limit,
                                             out int totalRecords,
                                             string query)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_get_list_empresas(integer,--start $1
                //            integer,--limit $2
                //            varchar --query $3
                //            )RETURNS SETOF refcursor AS
                return Core.GetListObjecstDb<oEmpresa>("pca.fn_get_list_empresas",
                                                       out totalRecords,
                                                       new oParametro(NpgsqlDbType.Integer, start),
                                                       new oParametro(NpgsqlDbType.Integer, limit),
                                                       new oParametro(NpgsqlDbType.Varchar, query));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        #endregion
    }
}
